#ifndef _PLATEAU_H
#define _PLATEAU_H

/*!
* \file Plateau.h
* \author PRZYBYLSKI Bastien
* \author DESPRES Antoine
* \date 16 fevrier 2010
*/

#include <vector>
#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#include "Case.h"
#include "CaseI.h"
#include "CaseL.h"
#include "CaseT.h"
#include "CaseDepart.h"
#include "Rangee.h"
#include "Tresor.h"

class Plateau {

/*!
* \class Plateau
* \brief Le plateau de jeu, constitué de 7x7 cases et d'une case libre
*/
  private:
	vector<vector<Case*> > _cases;
	Case * _caseLibre;
    Rangee _rangeeCaseLibre;

	/*!
	* \brief Renvoie une case aleatoire choisi parmi un lot.
	* \param vec : Pointeur sur un vecteur contenant les pointeurs des cases constituant le lot.
	* \return Un pointeur sur une case
	*/
	Case* caseAleatoire(vector<Case*>* vec);

	/*!
	* \brief Indique quels sont les cases accessibles depuis la position donnée
	* \param ligne: Indice de la ligne.
	* \param colonne: Indice de la colonne.
	* \param vec: Pointeur sur le vecteur contenant la liste des cases rescencées.
	*/
	void casesAccessibles(int ligne, int colonne,vector<Case*>* vec);

  public:

	/*!
	* \brief Verifie si la case _case est dans le vecteur vec
	* \param _case : Pointeur sur la case à tester
	* \param vec : Pointeur sur le vecteur qui peut contenir la case
	*/
	bool casePresente(Case * _case, vector<Case*>* vec);

	/*!
	* \brief Fais pivoter la case libre
	* \param direction : la nouvelle orientation
	*/
    void pivoterCaseLibre(int direction);

	/*!
	* \brief Insere la case libre et modifie le plateau. (PS : Aucun deplacement de joueurs)
	* \param direction : la nouvelle orientation.
	*/
    void insereCaseLibre();

	/*!
	* \brief Indique quels sont les cases accessibles depuis la case de depart
	* \param depart : un pointeur sur la case de depart
	* \return Un vecteur de cases.
	*/
	vector<Case*> casesAccessibles(const Case* depart);


	/*!
	* \brief Renvoie la rangee de la case libre.
	* \return La rangee de la case libre.
	*/
    Rangee getRangeeCaseLibre();

	/*!
	* \brief Change la rangee de la case libre. La rangée n'est modifiée que si son indice 
	* correspond à 1,3 ou 5. (Sinon on considere que la colonne est inexistante ou fixe).
	* \param rang : la nouvelle rangee
	*/
    void setRangeeCaseLibre(Rangee rang);

	/*!
	* \brief Renvoie la case libre.
	* \return Un pointeur sur la case libre.
	*/
	Case* getCaseLibre();

	/*!
	* \brief Renvoie la case positionnée en (i,j)
	* \param i : ligne de la case
	* \param j : colonne de la case
	* \return Un pointeur sur la case voulue.
	*/
	Case* getCase(int i, int j);

	/*!
	* \brief Renvoie le tableau de cases
	* \return La matrice contenant les pointeurs des cases du plateau de jeu.
	*/
	vector<vector<Case*> > getTable();

	/*!
	* \brief Constructeur par defaut
	*/
	Plateau();

	/*!
	* \brief Constructeur complet
	* \param tres: Tableau contenant les tresors mis en jeu
	*/
	Plateau(Tresor tres[]);

	/*!
	* \brief Affiche le plateau. Obsolete. Tests uniquement
	*/
	void affiche();
	

};
#endif
